package com.mh.mh.netty.zdy;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageCodec;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;

/**
 * @author Administrator
 */
public class MessageCodec extends ByteToMessageCodec<MyMessage> {
    @Override
    protected void encode(ChannelHandlerContext ctx, MyMessage msg, ByteBuf out) throws Exception {
        // 约定一个 4 字节的魔数
        out.writeBytes(new byte[]{1,2,3,4});
        // 1字节的版本
        out.writeByte(1);
        // 1 字节的序列化方式  0 jdk, 1 json
        out.writeByte(0);
        // 1字节的指令类型
        out.writeByte(msg.getLogin());
        // 4个字节的请求序号，用于双方通讯(暂时不用)
        out.writeInt(1234);

        // 获取内容的字节数组, msg 写入到oos中，oos再写入到bos中
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(msg);
        byte[] bytes = bos.toByteArray();

        // 获取长度
        out.writeInt(bytes.length);

        // 写入内容
        out.writeBytes(bytes);
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        int magicNum = in.readInt();
        byte version = in.readByte();
        byte serilizerType = in.readByte();
        byte messageType = in.readByte();
        int sequenceId = in.readInt();
        int length = in.readInt();
        byte[] bytes = new byte[length];
        in.readBytes(bytes, 0, length);// in 写入到 bytes 中
        if(serilizerType == 0){
            // 判断是 jdk 序列化方式
            // 对 bytes 进行反序列化
            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
            MyMessage message = (MyMessage) ois.readObject();// 因为序列化的时候，是用的MyMessage，所以这里强转。
            out.add(message);// 装入到 list 中，为了给下一个handler使用
        }

    }

}

































